package com.bolang.onlycode.demo.MyThread;

// 假设有abc线程，a线程它内部要循环十次，他要负责打印10次a
// 当他第一次打印完a后他要做两件事情

/**
 * 假设有abc线程，a线程它内部要循环十次，他要负责打印10次a
 * 当他打印完一次a后他要做两件事情
 * 1. 停下当前线程
 * 2. 唤醒B线程
 * 停下当前线程很容易，问题是如何唤醒指定线程
 * 停下也就是调用wait方法，问题是停下来后本线程后面所有的代码都不会执行
 * 所以它不能在停下来后去唤醒下一个线程，而是要在停下来之前去唤醒
 * -------------------------------------------------------
 * 现在的这个方法，在打印完a之后根本没有停下来，他是继续执行，只是下一次执行时判断达不到条件才停下来
 */
public class LoopABC {
    public static final Object object = new Object();
    public int i;

    public void print(int a) {

        synchronized (object) {

            for (int b = 0; b < 3; ) {
                while (i % 3!= a) {
                    try {
//                        System.out.println(Thread.currentThread().getName()+"要wait了"+i);
                        object.wait();
//                        System.out.println(Thread.currentThread().getName()+"醒来了了"+i);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                i++;
                b++;
                System.out.println(Thread.currentThread().getName());

                object.notifyAll();


            }
        }

    }

    public static void main(String[] args) {
        LoopABC loopABC = new LoopABC();
        new Thread(() -> loopABC.print(0), "x").start();
        new Thread(() -> loopABC.print(1), "y").start();
        new Thread(() -> loopABC.print(2), "Z").start();


    }


}
